/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Seguridad.Controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Date;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Continente;
import pe.edu.pucp.Modelo.Pais;
import pe.edu.pucp.Modelo.Password;
import pe.edu.pucp.Modelo.Perfil;
import pe.edu.pucp.Modelo.TipoCorreo;
import pe.edu.pucp.Modelo.TipoDocumento;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Seguridad.DAO.ConfiguracionDAO;
import pe.edu.pucp.Seguridad.DAO.UsuarioDAO;
import pe.edu.pucp.Seguridad.Vista.UsuarioGUI;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.EmailHelper;
import pe.edu.pucp.Util.Encriptador;
import pe.edu.pucp.Util.LogHelper;
import pe.edu.pucp.Util.ValHelper;
/**
 *
 * @author jorge
 */
public class UsuarioControlador {
    private UsuarioDAO m;
    private UsuarioGUI view;
    private Usuario usr;    
    private Usuario usract;    
    private BuscarUsuarioControlador buscarUsuarioControlador;
    private ArrayList<Ciudad> lstCiudad;    
    private ArrayList<Aeropuerto> lstAeropuerto;    
    private ArrayList<Pais> lstPais ;
    private ArrayList<Continente> lstContinente;
    private ArrayList<TipoDocumento> lstTipoDocUsuario;
    private ArrayList<TipoCorreo> lstTipoCorreo;
    private ArrayList<Perfil> lstPerfil;      

    public UsuarioControlador(UsuarioDAO dao, UsuarioGUI uview, BuscarUsuarioControlador buc, Usuario usuario, Usuario usuarioact){
        m = dao;
        view = uview;
        buscarUsuarioControlador = buc;
        usr=usuario;
        usract = usuarioact;
        view.addCancelarListener(new cancelarListener());        
        view.addLimpiarListener(new limpiarListener());              
        view.addCambiarContinente(new cambiarLstPais());
        view.addCambiarPais(new cambiarLstCiudad());
        view.addCambiarCiudad(new cambiarLstAeropuerto());  
        
        llenarContinenteCombo();              
        llenarPaisCombo(lstContinente.get(view.getContinente()));
        llenarCiudadCombo(lstPais.get(view.getPais()));
        llenarAeropuertoCombo(lstCiudad.get(view.getCiudad()));
        llenarTipoDocCombo();
        llenarCorreoCombo();        
        llenarPerfilCombo();        

        view.setFormUsuario(usr);
                
        if (usr!=null){
            view.addGuardarListener(new editarUsuarioListener());
            view.setEstadoGuardar("Modificar","Modificar Usuario");            
        }            
        else{
            view.addGuardarListener(new registrarUsuarioListener());
            view.setEstadoGuardar("Registrar","Registrar Usuario");
        }                                  
    }

    private void llenarAeropuertoCombo(Ciudad ciu){
        lstAeropuerto = m.listarAeropuerto(ciu.getIdciudad());
        view.llenaComboAeropuerto(lstAeropuerto);
    }       
    
    private void llenarCiudadCombo(Pais pa){
        lstCiudad = m.listarCiudad(pa.getIdpais());
        view.llenaComboCiudad(lstCiudad);
    }   

    private void llenarPerfilCombo(){
        lstPerfil = m.listarPerfil();
        view.llenaComboPerfil(lstPerfil);
    }      
    
    private void llenarContinenteCombo(){
        lstContinente = m.listarContinente();
        view.llenaComboContinente(lstContinente);
    }

    private void llenarPaisCombo(Continente cont){            
        lstPais = m.listarPais(cont.getIdcontinente());
        view.llenaComboPais(lstPais);
    }     

    private void llenarTipoDocCombo(){
        lstTipoDocUsuario = m.listarTipoDoc();
        view.llenaComboTipoDoc(lstTipoDocUsuario);
    }    
    
    private void llenarCorreoCombo(){
        lstTipoCorreo = m.listarTipoCorreo();
        view.llenaComboCorreo(lstTipoCorreo);
    }       
    
    public Password nuevoPass(String pass, Usuario usr){
        Password p = new Password();
        p.setPass(pass);              
        p.setEstadoPassword(m.buscarEstadoPass(Constante.ESTADO_PASSWORD_ACTIVO));
        p.setFechareg(new Date());
        p.setUsuario(usr);
        return p;
    }    


    class editarUsuarioListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            if (view.getNombre().isEmpty()){
                ValHelper.mostrarError("El campo de nombre está vacío");                
                return;
            }
            if (view.getCiudad() < 0){
                ValHelper.mostrarError("La ciudad no ha sido seleccionada");                
                return;
            }             
            if (view.getApMaterno().isEmpty()){
                ValHelper.mostrarError("El campo de apellido materno está vacío");                
                return;
            }
            if (view.getApPaterno().isEmpty()){
                ValHelper.mostrarError("El campo de apellido paterno está vacío");                
                return;
            }
            if (view.getNumDoc().isEmpty()){
                ValHelper.mostrarError("El campo de número de documento está vacío");                
                return;
            }
            if (view.getNumDoc().length()< 8){
                ValHelper.mostrarError("El número de documento debe tener mínimo 8 caracteres");                
                return;
            }              
            if (m.existeDNI(view.getNumDoc(), lstTipoDocUsuario.get(view.getTipoDoc()).getIdtipodoc(),usr.getIdusuario())){
                ValHelper.mostrarError("El documento ingresado ya se encuentra registrado");                                                
                return;
            }  
            if (view.getCorreo().isEmpty()){
                ValHelper.mostrarError("El campo de correo está vacío");                
                return;
            }            
            if (m.existeCorreo(view.getCorreo(), lstTipoCorreo.get(view.getTipoCorreo()).getIdtipocorreo(),usr.getIdusuario())){
                ValHelper.mostrarError("El correo ingresado ya se encuentra registrado");                                                
                return;
            }             
            usr.setNombre(view.getNombre());
            usr.setApmaterno(view.getApMaterno());
            usr.setAppaterno(view.getApPaterno());
            usr.setTelefono(view.getTelefono());            
            usr.setDireccion(view.getDireccion());
            usr.setDocumento(view.getNumDoc());
            usr.setCorreo(view.getCorreo());
            usr.setMaxfallo(view.getMaxFallo());                    
            usr.setPerfil(lstPerfil.get(view.getPerfil()));            
            usr.setAeropuerto(lstAeropuerto.get(view.getAeropuerto()));            
            usr.setTipoCorreo(lstTipoCorreo.get(view.getTipoCorreo()));
            usr.setTipoDocumento(lstTipoDocUsuario.get(view.getTipoDoc()));                        
              
            m.modificarUsuario(usr);
            LogHelper.registrarOperacion(usract, Constante.ACCION_MODIFICAR, Constante.OBJETO_USUARIO, "Se modificó el usuario "+usr.getNombusr());
            ValHelper.mostrarAviso("Se modificó el usuario con éxito");            
            buscarUsuarioControlador.listarResultados();  
            buscarUsuarioControlador.updateMain(usr);
            view.dispose();            
        }
    }    
    
    class registrarUsuarioListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            if (view.getNombre().isEmpty()){
                ValHelper.mostrarError("El campo de nombre está vacío");                
                return;
            }
            if (view.getApMaterno().isEmpty()){
                ValHelper.mostrarError("El campo de apellido materno está vacío");                
                return;
            }
            if (view.getApPaterno().isEmpty()){
                ValHelper.mostrarError("El campo de apellido paterno está vacío");                
                return;
            }
            if (view.getNumDoc().isEmpty()){
                ValHelper.mostrarError("El campo de número de documento está vacío");                
                return;
            }                
            if (view.getNumDoc().length()< 8){
                ValHelper.mostrarError("El número de documento debe tener mínimo 8 caracteres");                
                return;
            }             
            if (m.existeDNI(view.getNumDoc(), lstTipoDocUsuario.get(view.getTipoDoc()).getIdtipodoc())){
                ValHelper.mostrarError("El documento ingresado ya se encuentra registrado");                                                
                return;
            }  
            if (view.getCorreo().isEmpty()){
                ValHelper.mostrarError("El campo de correo está vacío");                
                return;
            }            
            if (m.existeCorreo(view.getCorreo(), lstTipoCorreo.get(view.getTipoCorreo()).getIdtipocorreo())){
                ValHelper.mostrarError("El correo ingresado ya se encuentra registrado");                                                
                return;
            }                        
            Usuario a = new Usuario();            
            Encriptador cripto=new Encriptador();                      
            a.setEstadoUsuario(m.buscarEstado(Constante.ESTADO_USUARIO_ACTIVO));
            a.setConexion(m.buscarEstadoConexion(Constante.ESTADO_SESION_DESCONECTADO));            
            a.setNumfallo(0);        
            a.setNombre(view.getNombre());
            a.setApmaterno(view.getApMaterno());
            a.setAppaterno(view.getApPaterno());
            a.setTelefono(view.getTelefono());            
            a.setDireccion(view.getDireccion());
            a.setDocumento(view.getNumDoc());
            a.setCorreo(view.getCorreo());
            a.setMaxfallo(view.getMaxFallo());                    
            a.setPerfil(lstPerfil.get(view.getPerfil()));            
            a.setAeropuerto(lstAeropuerto.get(view.getAeropuerto()));            
            a.setTipoCorreo(lstTipoCorreo.get(view.getTipoCorreo()));
            a.setTipoDocumento(lstTipoDocUsuario.get(view.getTipoDoc()));            
            a.setNombusr(ValHelper.generarNombreUsuario(view.getNombre(),view.getApPaterno()));
            a.setFechareg(new Date());               
                      
            a=m.guardarUsuario(a);            

            String npass = ValHelper.generarPass((new ConfiguracionDAO()).buscarConfiguracion());
            Password pwd = nuevoPass(cripto.encriptar(npass),a);                                    
            m.guardarPassword(pwd);

            EmailHelper.enviarCorreo(a.getCorreo()+a.getTipoCorreo().getExtension(), a.getNombre(), a.getNombusr(), npass);
            LogHelper.registrarOperacion(usract, Constante.ACCION_REGISTRAR, Constante.OBJETO_USUARIO, "Se registró el usuario "+a.getNombusr());
            ValHelper.mostrarAviso("Se registró el usuario con éxito");

            buscarUsuarioControlador.listarResultados();            
            view.dispose();                                   
        }
    }
    
    class cancelarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {            
            view.dispose();
        }        
    }    
    
    class cambiarLstPais implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange()== ItemEvent.SELECTED){
                llenarPaisCombo(lstContinente.get(view.getContinente()));                
            }
        }        
    }  
    
    class cambiarLstCiudad implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {            
            if (e.getStateChange()== ItemEvent.SELECTED){
                llenarCiudadCombo(lstPais.get(view.getPais()));
            }
        }        
    }       

    class cambiarLstAeropuerto implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {            
            if (e.getStateChange()== ItemEvent.SELECTED){
                llenarAeropuertoCombo(lstCiudad.get(view.getCiudad()));
            }
        }        
    }      
    
    class limpiarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            view.LimpiarDatos();
        }        
    }    
}
